package com.jsaas.sys.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.SqlPara;
import com.jfinal.plugin.redis.Redis;
import com.jsaas.common.Constant;
import com.jsaas.core.qparams.PageQueryParams;
import com.jsaas.model.Menu;

/**   
* @Title: MenuService.java 
* @Package com.jsaas.sys.service 
* @Description: TODO(用一句话描述该文件做什么) 
* @author tuozq 
* @date 2017年11月10日 上午9:41:09 
* @version V1.0   
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public class MenuService {
	
	public static final String allmenu_cache_name = "allmenu_cache";
	public static final String menu_route_no = "menu_root";//根节点
	
	/**
	 * 获取树形结构菜单数据
	 * @param wheres
	 * @return
	 */
	
	public Ret getTree(Kv wheres){
		List<Menu> list = Menu.dao.find("select id,parent_id,menu_name,menu_no,long_no,menu_url from sys_menu order by long_no ");
		List<Map> maps = new ArrayList<Map>();
		for (Menu menu : list) {
			Map map = new HashMap<String, Object>();
			if(menu.getMenuNo().equals(menu_route_no)){
				map.put("open", true);
			}
			map.put("id", menu.getId());
			map.put("pId", menu.getParentId());
			map.put("name", menu.getMenuName());
			map.put("longNo", menu.getLongNo());
			map.put("menuUrl", menu.getMenuUrl());
			map.put("iconSkin", "iconmenu");
			maps.add(map);
		}
		return Ret.ok().set("data", maps);
	}
	
	/**
	 * 递归获取子节点
	 * @param node
	 * @param list
	 */
	public void getChildrens(Menu node, List<Menu> list){
		List<Menu> subList = null;
		if(node.get("children") == null){
			subList = new ArrayList<Menu>();
			node.put("children", subList);
		}else{
			subList = node.get("children");
		}
		node.put("spread", true);
		for (Menu menu : list) {
			if(node.getId().equals(menu.getStr("parentid"))){
				subList.add(menu);
				getChildrens(menu, list);
			}
		}
	}
	
	public Ret save(Menu menu){
		if(menu.isExist("menu_no", menu.getMenuNo())){
			return Ret.fail().set("msg", "菜单编码不允许重复");
		}
		if(menu.isExist("menu_name", menu.getMenuName())){
			return Ret.fail().set("msg", "菜单名称不允许重复");
		}
		menu.saveTree();
		Redis.use(Constant.COMMON_CACHE).del(MenuService.allmenu_cache_name);
		return Ret.ok();
	}
	
	public Ret delete(String id){
		Menu menu = Menu.dao.findById(id);
		if(!menu.getIsLeaf()){
			return Ret.fail().set("msg", menu.getMenuName() + " 存在子菜单，请先删除子菜单！");
		}
		SqlPara sqlPara = Db.getSqlPara("menu.findMenu", Kv.by("parentid", menu.getParentId()));
		List<Menu> childrens = Menu.dao.find(sqlPara);
		//如果删除菜单的父菜单剩下最后一子菜单时  更新父菜单为叶子节点
		if(childrens.size() == 1){
			Db.update(" update sys_menu set isLeaf = 1 where id = ? ", menu.getParentId());
		}
		Menu.dao.deleteById(id);
		Redis.use(Constant.COMMON_CACHE).del(allmenu_cache_name);
		return Ret.ok();
	}
	
	/**
	 * 菜单选择下拉框数据源
	 * @return
	 */
	public List<Menu> getAllMenu(){
		List<Menu> menus = Menu.dao.findByCache(Constant.COMMON_CACHE, allmenu_cache_name, "select id,menu_name,long_name from sys_menu order by long_no");
		return menus;
	}
	
	/**
	 * 分页查询
	 * @param params
	 * @return
	 */
	public Page<Menu> getList(PageQueryParams params){
		return Menu.dao.pageinit(params);
	}
	
	
	
}
